home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / REGSVR.PAK / REGSVR.CPP < prev    next >
C/C++ Source or Header  |  1997-05-06  |  5KB  |  224 lines

  1. // regsvr.cpp : Program to invoke OLE self-registration on a DLL.
  2. //
  3. // This is a part of the Microsoft Foundation Classes C++ library.
  4. // Copyright (C) 1992-1995 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // Microsoft Foundation Classes Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Microsoft Foundation Classes product.
  12.  
  13. #include <tchar.h>
  14. #include <stdio.h>
  15. #include <windows.h>
  16. #include "resource.h"
  17.  
  18. #ifdef __BORLANDC__
  19.     #include <dos.h> //for _argc _argv
  20.    #define __argc _argc
  21.    #define __argv _argv
  22. #endif
  23.  
  24. #define FAIL_ARGS    1
  25. #define FAIL_OLE    2
  26. #define FAIL_LOAD    3
  27. #define FAIL_ENTRY    4
  28. #define FAIL_REG    5
  29.  
  30. static TCHAR _szAppName[] = _T("RegSvr32");
  31. static char _szDllRegSvr[] = "DllRegisterServer";
  32. static char _szDllUnregSvr[] = "DllUnregisterServer";
  33. static HINSTANCE _hInstance = NULL;
  34.  
  35. static BOOL _bSilent = FALSE;
  36. static BOOL _bConsole = FALSE;
  37.  
  38. #define SafePutts(string) ((stdout >= 0) ? _putts(string) : 0) 
  39.  
  40. void FormatString2(LPTSTR lpszOut, LPCTSTR lpszFormat, LPCTSTR lpsz1,
  41.     LPCTSTR lpsz2)
  42. {
  43.     LPCTSTR pchSrc = lpszFormat;
  44.     LPTSTR pchDest = lpszOut;
  45.     while (*pchSrc != '\0')
  46.     {
  47.         if (pchSrc[0] == '%' && (pchSrc[1] >= '1' && pchSrc[1] <= '2'))
  48.         {
  49.             lstrcpy(pchDest, (LPCTSTR)(pchSrc[1] == '1' ? lpsz1 : lpsz2));
  50.             pchDest += lstrlen(pchDest);
  51.             pchSrc += 2;
  52.         }
  53.         else
  54.         {
  55.             if (_istlead(*pchSrc))
  56.                 *pchDest++ = *pchSrc++; // copy first of 2 bytes
  57.             *pchDest++ = *pchSrc++;
  58.         }
  59.     }
  60.     *pchDest = '\0';
  61. }
  62.  
  63. #define MAX_STRING 1024
  64.  
  65. void DisplayMessage(UINT ids, LPCTSTR pszArg1 = NULL, LPCTSTR pszArg2 = NULL,
  66.     BOOL bUsage = FALSE, BOOL bInfo = FALSE)
  67. {
  68.     if (_bSilent && !_bConsole)
  69.         return;
  70.  
  71.     TCHAR szFmt[MAX_STRING];
  72.     LoadString(_hInstance, ids, szFmt, MAX_STRING);
  73.  
  74.     TCHAR szText[MAX_STRING];
  75.     FormatString2(szText, szFmt, pszArg1, pszArg2);
  76.     if (bUsage)
  77.     {
  78.         int cch = _tcslen(szText);
  79.         LoadString(_hInstance, IDS_USAGE, szText + cch, MAX_STRING - cch);
  80.     }
  81.  
  82.     if (! _bSilent)
  83.         MessageBox(NULL, szText, _szAppName,
  84.             MB_TASKMODAL | (bInfo ? MB_ICONINFORMATION : MB_ICONEXCLAMATION));
  85.  
  86.     if (_bConsole)
  87.     {
  88.         TCHAR szMessage[MAX_STRING];
  89.         FormatString2(szMessage, _T("%1: %2\n"), _szAppName, szText);
  90.         SafePutts(szMessage);
  91.     }
  92. }
  93.  
  94. inline void Usage(UINT ids, LPCTSTR pszArg1 = NULL, LPCTSTR pszArg2 = NULL)
  95.     { DisplayMessage(ids, pszArg1, pszArg2, TRUE); }
  96.  
  97. inline void Info(UINT ids, LPCTSTR pszArg1 = NULL, LPCTSTR pszArg2 = NULL)
  98.     { DisplayMessage(ids, pszArg1, pszArg2, FALSE, TRUE); }
  99.  
  100. int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
  101. {
  102.     int iReturn = 0;
  103.     HRESULT (FAR STDAPICALLTYPE * lpDllEntryPoint)(void);
  104.  
  105.     BOOL bVisualC = FALSE;
  106.     BOOL bUnregister = FALSE;
  107.     LPSTR pszDllEntryPoint = _szDllRegSvr;
  108.     LPSTR pszDllName = NULL;
  109.     LPSTR pszTok;
  110.  
  111.     _hInstance = hInstance;
  112.  
  113.     // Parse command line arguments.
  114.     for (int iTok = 1; iTok < __argc; iTok++)
  115.     {
  116.         pszTok = __argv[iTok];
  117.  
  118.         if ((pszTok[0] == '-') || (pszTok[0] == '/'))
  119.         {
  120.             switch (pszTok[1])
  121.             {
  122.             case 'v':
  123.             case 'V':
  124.                 bVisualC = TRUE;
  125.                 break;
  126.  
  127.             case 's':
  128.             case 'S':
  129.                 _bSilent = TRUE;
  130.                 break;
  131.                 
  132.             case 'u':
  133.             case 'U':
  134.                 bUnregister = TRUE;
  135.                 pszDllEntryPoint = _szDllUnregSvr;
  136.                 break;
  137.  
  138.             case 'c':
  139.             case 'C':
  140.                 _bConsole = TRUE;
  141.                 break;
  142.                 
  143.             default:
  144.                 Usage(IDS_UNRECOGNIZEDFLAG, pszTok);
  145.                 return FAIL_ARGS;
  146.             }
  147.         }
  148.         else
  149.         {
  150.             if (pszDllName == NULL)
  151.                 pszDllName = pszTok;
  152.             else
  153.             {
  154.                 Usage(IDS_EXTRAARGUMENT, pszTok);
  155.                 return FAIL_ARGS;
  156.             }
  157.         }
  158.     }
  159.  
  160.     if (pszDllName == NULL)
  161.     {
  162.         if (bVisualC)
  163.             DisplayMessage(IDS_NOPROJECT);
  164.         else
  165.             Usage(IDS_NODLLNAME);
  166.  
  167.         return FAIL_ARGS;
  168.     }
  169.  
  170.     // Initialize OLE.                
  171.     if (FAILED(OleInitialize(NULL)))
  172.     {
  173.         DisplayMessage(IDS_OLEINITFAILED);
  174.         return FAIL_OLE;
  175.     }
  176.  
  177.     // Load the library.    
  178.     HINSTANCE hLib = LoadLibrary(pszDllName);
  179.  
  180.     if (hLib < (HINSTANCE)HINSTANCE_ERROR)
  181.     {
  182.         TCHAR szError[12];
  183.         wsprintf(szError, _T("0x%08lx"), GetLastError());
  184.         DisplayMessage(IDS_LOADLIBFAILED, pszDllName, szError);
  185.         iReturn = FAIL_LOAD;
  186.         goto CleanupOle;
  187.     }
  188.  
  189.     // Find the entry point.        
  190.     (FARPROC&)lpDllEntryPoint = GetProcAddress(hLib, pszDllEntryPoint);
  191.  
  192.     if (lpDllEntryPoint == NULL)
  193.     {
  194.         TCHAR szExt[_MAX_EXT];
  195.         _tsplitpath(pszDllName, NULL, NULL, NULL, szExt);
  196.  
  197.         if ((stricmp(szExt, ".dll") != 0) && (stricmp(szExt, ".ocx") != 0))
  198.             DisplayMessage(IDS_NOTDLLOROCX, pszDllName, pszDllEntryPoint);
  199.         else
  200.             DisplayMessage(IDS_NOENTRYPOINT, pszDllName, pszDllEntryPoint);
  201.  
  202.         iReturn = FAIL_ENTRY;
  203.         goto CleanupLibrary;
  204.     }
  205.  
  206.     // Call the entry point.    
  207.     if (FAILED((*lpDllEntryPoint)()))
  208.     {
  209.         DisplayMessage(IDS_CALLFAILED, pszDllEntryPoint, pszDllName);
  210.         iReturn = FAIL_REG;
  211.         goto CleanupLibrary;
  212.     }
  213.  
  214.     Info(IDS_CALLSUCCEEDED, pszDllEntryPoint, pszDllName);
  215.  
  216. CleanupLibrary:
  217.     FreeLibrary(hLib);
  218.  
  219. CleanupOle:
  220.     OleUninitialize();
  221.         
  222.     return iReturn;
  223. }            
  224.